home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 2
/
CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso
/
magazine
/
amiga_e
/
cardall.e
< prev
next >
Wrap
Text File
|
1994-04-06
|
3KB
|
110 lines
CONST MEMSTART=$600000, BLOCKSIZE=$100, FILEINFOSIZE=$20, MAGIC=$2000
CONST HEADEROFF=2*BLOCKSIZE, BLKPTRSIZE=2, FILELEN=13
CONST FREEOFF=HEADEROFF+BLOCKSIZE, HEADER=HEADEROFF+MEMSTART
CONST FREEBLOCKS=FREEOFF+MEMSTART, EOFB=$FFFE, EOC=$FFFF, DEL=0, START=0
ENUM BAD_CARD, NO_FREE
OBJECT fileinfo
file, next
ENDOBJECT
/* lastinfo is a block pointer with MAGIC, e.g., $213A (not $13A) */
DEF thefiles:PTR TO fileinfo, lastfile:PTR TO fileinfo, lastinfo
PROC main() HANDLE
DEF f:PTR TO fileinfo
getinfo()
f:=thefiles.next
WHILE f
extractfile(f.file)
f:=f.next
ENDWHILE
EXCEPT
SELECT exception
CASE BAD_CARD
WriteF('No PCMCIA card, or not from Notepad\n')
CASE NO_FREE
WriteF('No more free blocks -- card is full\n')
ENDSELECT
ENDPROC
PROC extractfile(file)
DEF b, fh, i
IF deleted(file)
WriteF('Skipping deleted file\n')
ELSE
IF fh:=Open(name(file), NEWFILE)
WriteF('Extracting file "\s"\n', name(file))
b:=firstblock(file)
i:=size(file)
WHILE (b<>EOC) AND (b<>DEL)
Write(fh, address(b), IF i<BLOCKSIZE THEN i ELSE BLOCKSIZE)
i:=i-BLOCKSIZE
b:=follow(b)
ENDWHILE
Close(fh)
ELSE
WriteF('Cannot open output file "\s"\n', name(file))
ENDIF
ENDIF
ENDPROC
PROC getinfo()
DEF info, nofiles=FALSE, atend=FALSE, file
file:=HEADER
lastinfo:=firstblock(file)
thefiles:=lastfile:=newfile(file)
IF validate(file)
file:=file+FILEINFOSIZE
REPEAT /* for all info blocks */
REPEAT /* for all files */
IF blank(file)
nofiles:=TRUE
ELSE
lastfile.next:=newfile(file)
lastfile:=lastfile.next
file:=file+FILEINFOSIZE
IF Mod(file, BLOCKSIZE)=0 THEN atend:=TRUE
ENDIF
UNTIL atend OR nofiles
IF atend
info:=follow(lastinfo)
IF (info<>EOC) AND (info<>DEL)
lastinfo:=info
file:=address(lastinfo)
atend:=FALSE
ELSE
nofiles:=TRUE
ENDIF
ENDIF
UNTIL nofiles
ELSE
Raise(BAD_CARD)
ENDIF
ENDPROC
PROC follow(block) RETURN int(blockaddr(block))
PROC blockaddr(block) RETURN (block-MAGIC)*BLKPTRSIZE+FREEBLOCKS
PROC address(block) RETURN (block-MAGIC)*BLOCKSIZE+MEMSTART
PROC validate(file)
RETURN StrCmp(name(file), 'NC', 2) AND (firstblock(file)=HEADEROFF+MAGIC)
ENDPROC
PROC blank(file)
DEF n
FOR n:=0 TO FILEINFOSIZE-1 DO IF file[]++<>0 THEN RETURN FALSE
ENDPROC TRUE
PROC deleted(file) RETURN file[]=0
PROC name(file) RETURN file
PROC size(file) RETURN int(file+14)
PROC firstblock(file) RETURN int(file+20)
PROC int(p) RETURN p[]++ OR Shl(p[],8)
PROC newfile(ptr)
DEF p
CopyMem([ptr, NIL]:fileinfo, p:=New(SIZEOF fileinfo), SIZEOF fileinfo)
ENDPROC p